home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / utils / sano / sano.asm < prev    next >
Assembly Source File  |  1980-01-03  |  13KB  |  263 lines

  1. ;*
  2. ;
  3. ; ### Sano.asm by JM v 0.20c ###
  4. ;
  5. ; - Created 901025 by JM -
  6. ;
  7. ; Bugs: Well...
  8. ;
  9. ;
  10. ; Edited:
  11. ;
  12. ; - 901025 by JM -> v0.01       - started writing this thing.
  13. ; - 901029 by JM -> v0.10       - works.  dpy_msg has a buffer of 256 bytes.
  14. ; - 901220 by JM -> v0.20c      - this version commented for C=Lehti.
  15. ;
  16. ;
  17.  
  18.                 include "exec/types.i"
  19.                 include "exec/execbase.i"
  20.                 include "exec/tasks.i"
  21.                 include "exec/nodes.i"
  22.                 include "exec/memory.i"
  23.                 include "exec/io.i"
  24.                 include "exec/interrupts.i"
  25.                 include "hardware/intbits.i"
  26.                 include "libraries/dos.i"
  27.                 include "devices/narrator.i"
  28.  
  29.                 xref    _LVOOpenLibrary,_LVOCloseLibrary,_LVORawDoFmt
  30.                 xref    _LVOOpenDevice,_LVOCloseDevice,_LVODoIO
  31.                 xref    _LVOAllocMem,_LVOFreeMem,_LVOTranslate
  32.                 xref    _LVOAllocSignal,_LVOFindTask,_LVOFreeSignal
  33.                 xref    _LVOOutput,_LVOWrite
  34.  
  35. LF              equ     10              ; line feed
  36. BUFFER          equ     16384           ; „„nnepuskurin koko
  37.  
  38. .DosBase        equ     -4              ; muuttujien offsetit pinossa
  39. .FinnslatorBase equ     -8
  40. cmdlin          equ     -12
  41. cmdlen          equ     -16
  42. ioreq           equ     -20
  43. msgport         equ     -24
  44. narrator        equ     -25             ; lippu: narrator.device avattu
  45.  
  46. mem             equ     -30             ; muistiosoitin
  47. buffer          equ     -34             ; puskurin alkuosoite
  48. MEM             set     4+BUFFER        ; varattavan muistin koko
  49.  
  50. main            link    a4,#-34         ; varataan muuttujille tila pinosta
  51.                 move.l  a4,a1
  52.                 moveq   #7,d1
  53. 1$              clr.l   -(a1)           ; nollataan kaikki muuttujat pinossa
  54.                 dbf     d1,1$
  55.                 clr.w   -(a1)
  56.  
  57.                 clr.b   -1(a0,d0.l)             ; nolla komentorivin loppuun
  58.                 move.l  a0,cmdlin(a4)           ; tallenn. kom.rivin osoite
  59.                 move.l  d0,cmdlen(a4)           ; tallenn. kom.rivin pituus
  60.  
  61.                 lea     .DosName(pc),a1         ; dos-kirjaston nimi
  62.                 moveq   #0,d0                   ; mik„ tahansa versio kelpaa
  63.                 move.l  $4,a6                   ; execbase
  64.                 jsr     _LVOOpenLibrary(a6)     ; avataan dos.library
  65.                 move.l  d0,.DosBase(a4)         ; dosbase talteen
  66.                 beq     cleanup                 ; jos ei saatu auki, pois
  67.  
  68.                 move.l  #MEM,d0                 ; varattavan muistin koko
  69.                 move.l  #MEMF_CLEAR!MEMF_PUBLIC,d1      ; ja tyyppi
  70.                 move.l  $4,a6                   ; execbase
  71.                 jsr     _LVOAllocMem(a6)        ; varataan muistia puskurille
  72.                 move.l  d0,mem(a4)              ; muistin osoite talteen
  73.                 beq     cleanup                 ; jos ei saatu, pois
  74.                 move.l  d0,a0
  75.                 move.l  #MEM,(a0)+              ; varatun muistin koko talteen
  76.                 move.l  a0,buffer(a4)           ; puskurin osoite talteen
  77.  
  78.                 lea     .FinnslatorName(pc),a1  ; finnslator-kirjaston nimi
  79.                 moveq   #0,d0                   ; mik„ tahansa versio kelpaa
  80.                 jsr     _LVOOpenLibrary(a6)     ; avataan finnslator.library
  81.                 move.l  d0,.FinnslatorBase(a4)  ; perusosoite talteen
  82.                 beq     nofinn                  ; jos ei auennut, virhe
  83.  
  84.                 moveq   #MP_SIZE,d0             ; tarvittavan portin koko
  85.                 bsr     createport              ; luodaan viestiportti
  86.                 move.l  d0,msgport(a4)          ; tallennetaan sen osoite
  87.                 beq     cleanup                 ; jos nolla, ei saatu porttia
  88.                 moveq   #NDI_SIZE,d0            ; tarvittavan iorequestin koko
  89.                 bsr     createio                ; luodaan IOReq-struktuuri
  90.                 move.l  d0,ioreq(a4)            ; sen osoite talteen
  91.                 beq     cleanup                 ; jos nolla, ei saatu luotua
  92.  
  93.                 move.l  a0,a1                   ; ioreq:n osoite
  94.                 lea     channels(pc),a0         ; kanavamaskit
  95.                 move.l  a0,NDI_CHMASKS(a1)      ; IOReq:iin
  96.                 move.w  #4,NDI_NUMMASKS(a1)     ; maskien lukum„„r„
  97.                 clr.b   NDI_MOUTHS(a1)          ; ei tarvita suuinformaatiota
  98.                 lea     .NarratorName(pc),a0    ; narratorin nimi
  99.                 moveq   #0,d0                   ; unit=0
  100.                 moveq   #0,d1                   ; flags=0
  101.                 move.l  $4,a6                   ; execbase
  102.                 jsr     _LVOOpenDevice(a6)      ; avataan narrator.device
  103.                 tst.l   d0                      ; virhe?
  104.                 bne     nonarrator              ; jos, tulostetaan virheilmoitus
  105.                 st      narrator(a4)            ; lippu: narrator saatiin auki
  106.  
  107.                 move.l  cmdlin(a4),a0           ; komentorivin osoite
  108.                 move.l  cmdlen(a4),d0           ; pituus
  109.                 move.l  buffer(a4),a1           ; „„nnepuskurin osoite
  110.                 move.l  #BUFFER,d1              ; ja koko
  111.                 move.l  .FinnslatorBase(a4),a6  ; finnslator-perusosoite
  112.                 jsr     _LVOTranslate(a6)       ; muunnetaan teksti „„nteiksi
  113.  
  114.                 move.l  ioreq(a4),a1            ; IORequestin osoite
  115.                 move.l  buffer(a4),IO_DATA(a1)  ; asetetaan puskurin osoite
  116.                 move.l  #BUFFER,IO_LENGTH(a1)   ; ja pituus
  117.                 move.w  #CMD_WRITE,IO_COMMAND(a1)       ; komento = WRITE
  118.                 move.l  $4,a6                   ; execbase
  119.                 jsr     _LVODoIO(a6)            ; k„ynnistet„„n puhe
  120.                 bra     cleanup                 ; homma hanskassa -> pois
  121.  
  122. nonarrator      lea     .NarratorName(pc),a1    ; virhe: ei narratoria
  123.                 bra.s   err_out
  124.  
  125. nofinn          lea     .FinnslatorName(pc),a1  ; virhe: ei finnslatoria
  126. err_out         lea     ermsg(pc),a0            ; yleinen virheilmoitus
  127.                 move.l  a1,d0                   ; vikineen nimi d0:aan
  128.                 bsr     dpymsg
  129.  
  130. cleanup         tst.b   narrator(a4)            ; narrator auki?
  131.                 beq.s   10$
  132.                 move.l  ioreq(a4),a1            ; joo, suljetaan se
  133.                 move.l  $4,a6
  134.                 jsr     _LVOCloseDevice(a6)
  135. 10$             move.l  msgport(a4),a0          ; vapautetaan portti
  136.                 bsr     deleteport
  137.                 move.l  ioreq(a4),a0            ; vapautetaan IORequest
  138.                 bsr     deleteio
  139.  
  140.                 move.l  mem(a4),d0              ; muistia varattu?
  141.                 beq.s   11$
  142.                 move.l  d0,a1                   ; joo
  143.                 move.l  (a1),d0                 ; muistin koko
  144.                 move.l  $4,a6                   ; execbase
  145.                 jsr     _LVOFreeMem(a6)         ; vapautetaan muisti
  146. 11$             move.l  .FinnslatorBase(a4),d0  ; finnslator auki?
  147.                 beq.s   12$
  148.                 move.l  d0,a1                   ; joo
  149.                 move.l  $4,a6                   ; execbase
  150.                 jsr     _LVOCloseLibrary(a6)    ; suljetaan finnslator
  151. 12$             move.l  .DosBase(a4),d0         ; dos auki?
  152.                 beq.s   13$
  153.                 move.l  d0,a1                   ; joo
  154.                 move.l  $4,a6                   ; execbase
  155.                 jsr     _LVOCloseLibrary(a6)    ; suljetaan dos
  156. 13$             moveq   #0,d0                   ; virhekoodi = 0
  157.                 unlk    a4                      ; muuttujat pois pinosta
  158.                 rts                             ; paluu dossiin
  159.  
  160. createport      movem.l d2-d3/a2-a3,-(sp)       ; tulos: d0 = a0 = portin osoite
  161.                 addq.l  #4,d0                   ; tilaa portin koolle
  162.                 move.l  d0,d2                   ; varattava koko
  163.                 move.l  #MEMF_CLEAR!MEMF_PUBLIC,d1
  164.                 move.l  $4,a6
  165.                 jsr     _LVOAllocMem(a6)        ; varataan muisti
  166.                 move.l  d0,a2
  167.                 tst.l   d0
  168.                 beq     creaport1               ; ei muistia -> pois
  169.                 move.l  d2,(a2)+                ; portin koko talteen
  170.                 moveq.l #-1,d0                  ; mik„ tahansa sig.bitti kelpaa
  171.                 jsr     _LVOAllocSignal(a6)     ; varataan signaalibitti
  172.                 move.b  d0,MP_SIGBIT(a2)        ; tallennetaan bitin numero
  173.                 bmi.s   creaporte               ; bitti„ ei saatu -> pois
  174.                 sub.l   a1,a1
  175.                 jsr     _LVOFindTask(a6)        ; etsit„„n t„m„ taski
  176.                 move.l  d0,MP_SIGTASK(a2)       ; tallennetaan osoitin
  177.                 move.b  #NT_MSGPORT,LN_TYPE(a2) ; noden tyyppi = MsgPort
  178.                 move.b  #PA_SIGNAL,MP_FLAGS(a2) ; signaloidaan viestin saapuessa
  179.  
  180.                 lea     MP_MSGLIST(a2),a0
  181.                 NEWLIST A0                      ; alustetaan portin viestilista
  182.                 move.l  a2,d0
  183.                 bra.s   creaport1               ; homma selv„
  184. deleteport      movem.l d2-d3/a2-a3,-(sp)       ; a0 = portin osoite
  185.                 move.l  a0,d0
  186.                 beq.s   creaport1               ; nolla -> pois
  187.                 move.l  a0,a2
  188.                 moveq.l #0,d0
  189.                 move.b  MP_SIGBIT(a2),d0        ; signaalibitin numero
  190.                 bmi.s   creaporte               ; .mi -> ei bitti„ varattuna
  191.                 move.l  $4,a6
  192.                 jsr     _LVOFreeSignal(a6)      ; vapautetaan sigbit
  193. creaporte       move.l  -(a2),d0                ; varatun muistin koko
  194.                 move.l  a2,a1
  195.                 move.l  $4,a6
  196.                 jsr     _LVOFreeMem(a6)         ; vapautetaan muisti
  197.                 moveq.l #0,d0
  198. creaport1       movem.l (sp)+,d2-d3/a2-a3
  199.                 move.l  d0,a0
  200.                 rts
  201.  
  202. createio        movem.l d2/a2,-(sp)             ; d0=koko, a0=MsgPort; tulos: d0=ioreq
  203.                 move.l  a0,a2                   ; msgport* talteen
  204.                 addq.l  #4,d0                   ; tilaa stuktuurin koolle
  205.                 move.l  d0,d2
  206.                 move.l  #MEMF_PUBLIC!MEMF_CLEAR,d1
  207.                 move.l  $4,a6
  208.                 jsr     _LVOAllocMem(a6)        ; varataan muistia IORequestille
  209.                 move.l  d0,a0
  210.                 tst.l   d0
  211.                 beq.s   100$                    ; ei muistia -> pois
  212.                 move.l  d2,(a0)+                ; tallennetaan struktuurin koko
  213.                 move.l  a2,MN_REPLYPORT(a0)     ; portin osoite IORequestiin
  214.                 move.b  #NT_MESSAGE,LN_TYPE(a0) ; portin tyyppi
  215.                 subq.l  #4,d2
  216.                 move.w  d2,MN_LENGTH(a0)
  217.                 move.l  a0,d0                   ; palautetaan struktuurin osoite
  218. 100$            movem.l (sp)+,d2/a2
  219.                 rts
  220.  
  221. deleteio        move.l  a0,d0                   ; a0 = IoRequest
  222.                 beq.s   100$                    ; nolla -> ei tehd„ mit„„n
  223.                 move.l  a0,a1
  224.                 move.l  -(a1),d0                ; otetaan struktuurin koko
  225.                 move.l  $4,a6
  226.                 jsr     _LVOFreeMem(a6)         ; vapautetaan muisti
  227. 100$            rts
  228.  
  229. dpymsg          ;a0=fmstr, d0..d7=args
  230.                 movem.l d0-d7/a0-a3,-(sp)       ; rekisterit pinoon
  231.                 move.l  sp,a1                   ; osoitin datarekistereihin pinossa
  232.                 lea.l   putchar(pc),a2          ; putchar-rutiinin osoite
  233.                 move.l  buffer(a4),a3           ; puskurin osoite
  234.                 move.l  $4,a6
  235.                 jsr     _LVORawDoFmt(a6)        ; formatoidaan tulostus
  236.                 move.l  .DosBase(a4),a6
  237.                 jsr     _LVOOutput(a6)          ; tulostustiedoston filehandle
  238.                 move.l  d0,d1
  239.                 beq.s   201$                    ; jos nolla, ei voida tulostaa
  240.                 move.l  a3,d2
  241. 200$            tst.b   (a3)+                   ; lasketaan merkkijonon pituus
  242.                 bne.s   200$
  243.                 subq.w  #1,a3                   ; NULL-tavua ei lasketa
  244.                 move.l  a3,d3                   ; pituus d3:een
  245.                 sub.l   d2,d3
  246.                 jsr     _LVOWrite(a6)           ; tulostetaan puskurin sis„lt”
  247. 201$            movem.l (sp)+,d0-d7/a0-a3
  248.                 rts
  249. putchar         move.b  d0,(a3)+                ; putchar-rutiini RawDoFmt:lle
  250.                 rts
  251.  
  252. channels        dc.b    3,6,5,10,12             ; audio.devicen kanavamaskit
  253.  
  254. .DosName        dc.b    'dos.library',0
  255. .FinnslatorName dc.b    'finnslator.library',0
  256. .NarratorName   dc.b    "narrator.device",0
  257. ermsg           dc.b    "Unable to open %s.",LF,0
  258.                 ds.w    0
  259.  
  260.                 end
  261.  
  262.  
  263.